package slcu.solicitudaltaalumno;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import slcu.DeportistaAlreadyRegisteredException;
import slcu.model.Deportista;
import slcu.model.Escuela;
import slcu.service.DeportistaLocalServiceUtil;
import slcu.service.EscuelaLocalServiceUtil;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

/**
 * Portlet implementation class SolicitudAltaAlumnoPortlet
 */
public class SolicitudAltaAlumnoPortlet extends MVCPortlet {
 
	private static Log _log = LogFactoryUtil.getLog(SolicitudAltaAlumnoPortlet.class);
	
	public static String formularioSolicitudAltaAlumnoJsp = "/html/solicitudaltaalumno/formularioSolicitud.jsp";
	public static String solicitudAltaAlumnoEnviadaJsp = "/html/inscripcion/view.jsp";

	public void solicitarAltaAlumno(ActionRequest request, ActionResponse response) {

		ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();
		
		String nombre = ParamUtil.get(request, "nombre", "");
		String apellido = ParamUtil.get(request, "apellido", "");
		String dni = ParamUtil.get(request, "dni", "");
		String mail = ParamUtil.get(request, "mail", "");
		String escuelaId = ParamUtil.get(request, "escuelaId", "");
		String fechaNacimientoString = ParamUtil.get(request, "anioNacimiento", "") +
									   "-" + ParamUtil.get(request, "mesNacimiento", "") +
									   "-" + ParamUtil.get(request, "diaNacimiento", "");		
		long nivel = ParamUtil.getLong(request, "nivel", 0);
		
		if (nivel == 0) {
			SessionErrors.add(request, "nivel-no-valido");
		}
		
		Date ahora = new Date();

		/*
		if (!captchaIsValid(request)) {
			SessionErrors.add(request, "invalid-captcha");
		}
		*/

		Date fechaNacimiento = null;
		try {
			String[] arrFechaNacimiento = fechaNacimientoString.split("-");

			GregorianCalendar calendar = new GregorianCalendar(
					Integer.valueOf(arrFechaNacimiento[0]).intValue(),
					Integer.valueOf(arrFechaNacimiento[1]).intValue(),
					Integer.valueOf(arrFechaNacimiento[2]).intValue());

			fechaNacimiento = calendar.getTime();
		} catch (Exception e) {
			_log.error("Error al obtener la fecha: " + fechaNacimientoString, e);
			SessionErrors.add(request, "fecha-nacimiento-no-valida");
		}
		
		Escuela escuela = null;
		try {
			escuela = EscuelaLocalServiceUtil.getEscuela(Long.parseLong(escuelaId));
		} catch (NumberFormatException e) {
			_log.error("Error al transformar escuelaId: " + escuelaId, e);
			SessionErrors.add(request, "escuela-no-valida");
		} catch (Exception e) {
			_log.error("Error al obtener la escuela con escuelaId: " + escuelaId, e);
			SessionErrors.add(request, "escuela-no-encontrada");
		}
		
		EnvioSolicitudAltaAlumno solicitudAlta = new EnvioSolicitudAltaAlumno(nombre, apellido, dni, escuela, fechaNacimiento, String.valueOf(nivel), user, ahora);
		ResultadoValidacion validacion = ValidadorSolicitudAltaAlumno.validar(solicitudAlta);
		
		for (String errorClass : validacion.getMensajesDeError()) {
			SessionErrors.add(request, errorClass);
		}
		
		if (SessionErrors.isEmpty(request)) {
			try {
				Deportista deportista = DeportistaLocalServiceUtil.
						createDeportista(0);

				deportista.setApellido(apellido);
				deportista.setNombres(nombre);
				deportista.setDni(dni);
				deportista.setEscuelaId(escuela.getEscuelaId());
				deportista.setFecha_nacimiento(fechaNacimiento);
				deportista.setMail(mail);
				deportista.setNivel(nivel);

				DeportistaLocalServiceUtil.insertarDeportista(deportista,
						user);
				/*
				for (ReceptorType receptor: ConfiguracionAltaAlumno.obtenerReceptores()) {
					solicitudAlta.agregarReceptor(receptor);				
				}
				solicitudAlta.enviar();
				*/
			} catch (DeportistaAlreadyRegisteredException e) {
				SessionErrors.add(request, "dni-repetido");
			} catch (Exception e) {
				_log.error("Se ha producido un error al enviar la solicitud", e);
				SessionErrors.add(request, "error-al-enviar");
			}
		}
		
		if (SessionErrors.isEmpty(request)) {
			SessionMessages.add(request, "solicitud-enviada");
			response.setRenderParameter("jspPage", solicitudAltaAlumnoEnviadaJsp);
		} else {
			PortalUtil.copyRequestParameters(request, response);
			response.setRenderParameter("jspPage", formularioSolicitudAltaAlumnoJsp);			
		}
		
	}
	
    @Override
    public void serveResource(ResourceRequest resourceRequest,
                             ResourceResponse resourceResponse) throws IOException, PortletException {
        try {
            com.liferay.portal.kernel.captcha.CaptchaUtil.serveImage(resourceRequest, resourceResponse);
        } catch (Exception e) {
            _log.error(e);
        }
    }
    
    private Boolean captchaIsValid(PortletRequest request) {
        String enteredCaptchaText = ParamUtil.getString(request, "captchaText");

        PortletSession session = request.getPortletSession();
        String captchaText = getCaptchaValueFromSession(session);
        if (Validator.isNull(captchaText)) {
            _log.error("Internal Error! Captcha text not found in session");
        	return false;
        }
        return captchaText.equals(enteredCaptchaText);
    }

    private String getCaptchaValueFromSession(PortletSession session) {
        Enumeration<String> atNames = session.getAttributeNames();
        while (atNames.hasMoreElements()) {
            String name = atNames.nextElement();
            if (name.contains("CAPTCHA_TEXT")) {
                return (String) session.getAttribute(name);
            }
        }
        return null;
    }
	
}
